#include <stdlib.h>
#include <assert.h>  

#include "Objectif.h"

/*!<Cette fonction  permet d'ajouter(en fin)  une caisse dans la liste d'objectif. */
static void objAjout(ListeObjectif *pObj,int y, int x, EtatObjectif e)
{
	Objectif *obj_nouveau, *tmp;
	
	obj_nouveau=(Objectif *)malloc(sizeof(Objectif));
	obj_nouveau->x=x;
	obj_nouveau->y=y;
	obj_nouveau->etat_o =e;
	obj_nouveau->suivant=NULL;
	if(pObj->prem==NULL)
		pObj->prem=obj_nouveau;
	else
	{
		tmp=pObj->prem;
		while(tmp->suivant!=NULL)
		{
			tmp=tmp->suivant;
		}
		tmp->suivant=obj_nouveau;
	}
  
}

void  objInit(ListeObjectif  *pLobj, const Terrain *pTer)
{
	int x,y;
	
	pLobj->prem=NULL;
	
	for(y=0;y<getDimY(pTer);y++)
		for(x=0;x<getDimX(pTer);x++)
		{
			if(pTer->tab[y][x]=='x')
			{
				objAjout(pLobj,y,x,LIBRE_OBJECTIF);
				pLobj->nb_objectif++;
				assert(pLobj->prem!=NULL);
			}
		}
}


int objGetX(const Objectif *pObj) 
{
	return pObj->x;
}

int objGetY(const Objectif *pObj) 
{
	return pObj->y;
}

EtatObjectif objGetEtat(const Objectif *pObj)
{
	return pObj->etat_o;
}


Objectif *objGetPrem(const ListeObjectif *pLobj)
{
	return pLobj->prem;
}

Objectif *objGetSuivant(Objectif *pObj)
{
	if(pObj!=NULL)
		return pObj->suivant;
	return NULL;
}

int objGetNbObjectif(ListeObjectif  *pLobj)
{
	return pLobj->nb_objectif;
}

void objLibere(ListeObjectif *pLobj)
{
	Objectif *tmp=pLobj->prem;
	
	while(pLobj->prem!=NULL)
	{
		tmp=pLobj->prem;
		pLobj->prem=pLobj->prem->suivant;
		free(tmp);
	}
}

void objTestRegression()
{
	Terrain ter;
	Objectif *pObj, obj;
	ListeObjectif lobj;
		
	int X,Y;
	EtatObjectif etat_o;
	char nom_fichier[]="data/niveau/niveau1.txt";
	
	/*!<on initialise le terrain   la  liste d'objectif*/
	terInit(&ter, nom_fichier);
	objInit(&lobj,&ter);
	                                                                                                
	/*!<on verifie que la liste d'objectif a belle et bien ete initialise*/
	pObj=lobj.prem;
	assert(pObj!=NULL);

	/*!on verifie les coordonnees de l'objectif et son etat*/
	X=objGetX(&obj);
	Y=objGetY(&obj);
	etat_o=objGetEtat(&obj);

	/*!On verifie si l'adresse du premier objectif est valide*/
	pObj=objGetPrem(&lobj);
	assert(pObj!=NULL);
	
	/*!on verifie la fonction qui determine l'adresse de l'objectif qui suit celui passé en param*/
	pObj=objGetSuivant(pObj);
	assert(pObj!=NULL);
	
	
	
	/*!<on Libere les emplacements alloues pour le terrain et la liste des objectifs*/
	terLibere(&ter);
	objLibere(&lobj);
}
